package com.neko.redis;


import com.neko.App;
import com.neko.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.ArrayList;
import java.util.List;

/**
 * @Test 在 SB中 必须要加： @RunWith(SpringJUnit4ClassRunner.class) + @SpringBootTest(classes = {App.class})
 * 现在是在 SpringBoot 项目下, 无法直接启动 JUnit测试类 (因为没有启动 SB)
 * */
@RunWith(SpringJUnit4ClassRunner.class ) // 在 SB 项目中, 导入 JUnit4 这个 class
@SpringBootTest(classes = {App.class}) // 将 当前class 和 【启动class】 关联
public class RedisTest {

    /**
     * 哪里被创建？ 在 springboot @SpringBootApplication -> Autoconfigurer
     *  @EnableAutoConfiguration
     *
     * 项目栏 - 最下方
     * External Libraries
     *  - Maven: org.springframework.boot:spring-boot-autoconfigure:2.0.0.RELEASE 里面
     *      - org.springframework.boot.autoconfigure
     *         - data
     *          - redis
     *             - RedisProperties （默认配置）
     * ----------------------------------------------
     *
     *
     *
     * @ConfigurationProperties(prefix = "spring.redis") 可知
     *
     *      配置 Redis -> application.yml中 spring.redis.Xxx
     *
     * -----------------------------------------------
     *
     * 在 同一目录下的 redis/class RedisAutoConfiguration 放一些 默认初始化 @Bean
     *
     *  @EnableConfigurationProperties(RedisProperties.class)
     *  class ...
     *
     *  将 RedisProperties.class 启动配置拥有物
     *
     * */
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 存储 .boundXxxOps("key_name").set("value")
     * */
    @Test
    public void stringRedisTemplate_set() {
        stringRedisTemplate.boundValueOps("bbb").set("zhangsan");
        System.out.println("操作已经完成");
    }

    /**
     * 获取 element
     *  RedisTemplate.boundXxxOps("key_name").get()
     * -------------------------------------
     * ps: 如果 Redis 没有将 cache 持久化, 则每次都需要：先set后get
     *
     * */
    @Test
    public void stringRedisTemplate_get() {
        String bbb = this.stringRedisTemplate.boundValueOps("bbb").get();
        System.out.println(bbb);
    }

    /**
     * 通过 redis 存储 Object(Object must be implements Serializable
     * -------------------------------
     *  set() -> 序列化 过程
     */
    @Test
    public void redisTemplate_get() {

        // 必须设置： Redis 的【序列化器】 (将 jdk内置序列化工具 给 Redis序列化器
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());

        User user = new User();
        user.setId(1);
        user.setUsername("zhangsan");
        user.setPassword("123");

        redisTemplate.boundValueOps("user").set(user);

        System.out.println("操作已经完成...");
    }

    /**
     * .get() -> 反序列化 过程
     * */
    @Test
    public void redisTemplate_set() {
        // 设置【序列化器】
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());

        User user = (User) redisTemplate.boundValueOps("user").get();
        System.out.println(user);
    }


    @Test
    public void boundHashOps_put() {
//        redisTemplate.boundHashOps("list1").put("colorName", "red");
//
//        redisTemplate.boundHashOps("list1").put("person_name", "zhangsan");

        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("二手宝马");
        arrayList.add("二手奥拓");
        arrayList.add("二手拖拉机");

        this.redisTemplate.boundHashOps("list2").put("carName", arrayList);

        System.out.println("操作已经完成...");
    }

    @Test
    public void boundHashOps_get() {


//        Object o = this.redisTemplate.boundHashOps("list1").get("person_name");
//        System.out.println(o);
//        Object o1 = this.redisTemplate.boundHashOps("list1").get("colorName");
//        System.out.println(o1);

        List<String> list = (List<String>) this.redisTemplate.boundHashOps("list2").get("carName");

        for (String s : list) {
            System.out.println(s);
        }
    }
}
